package model

import (
	"context"
	"fmt"

	"gitee.com/liumou_site/glpm"
)

// GetPackageVersion 获取指定系统包的版本信息
// 参数:
//   - packageName: 要查询的包名
//
// 返回值:
//   - string: 包的版本信息
//   - error: 错误信息
func GetPackageVersion(packageName string) (string, error) {
	// 创建在线包管理器实例（自动检测系统包管理器）
	onlineMgr, err := glpm.NewOnlinePackageManager(nil)
	if err != nil {
		// 如果在线包管理器创建失败，尝试创建离线包管理器
		offlineMgr, err := glpm.NewOfflinePackageManager(nil)
		if err != nil {
			return "", fmt.Errorf("无法创建包管理器: %w", err)
		}

		// 使用离线包管理器获取包信息
		info, err := offlineMgr.Info(context.Background(), packageName)
		if err != nil {
			return "", fmt.Errorf("获取包信息失败: %w", err)
		}

		return info.Version, nil
	}

	// 使用在线包管理器获取包信息
	info, err := onlineMgr.Info(context.Background(), packageName)
	if err != nil {
		return "", fmt.Errorf("获取包信息失败: %w", err)
	}

	return info.Version, nil
}

// ListInstalledPackages 列出已安装的系统包
// 返回值:
//   - []string: 已安装包的列表，每个元素格式为"包名: 版本"
//   - error: 错误信息
func ListInstalledPackages() ([]string, error) {
	// 创建在线包管理器实例（自动检测系统包管理器）
	onlineMgr, err := glpm.NewOnlinePackageManager(nil)
	if err != nil {
		// 如果在线包管理器创建失败，尝试创建离线包管理器
		offlineMgr, err := glpm.NewOfflinePackageManager(nil)
		if err != nil {
			return nil, fmt.Errorf("无法创建包管理器: %w", err)
		}

		// 使用离线包管理器列出已安装的包
		packages, err := offlineMgr.ListInstalled(context.Background())
		if err != nil {
			return nil, fmt.Errorf("列出已安装包失败: %w", err)
		}

		// 格式化输出
		result := make([]string, len(packages))
		for i, pkg := range packages {
			result[i] = fmt.Sprintf("%s: %s", pkg.Name, pkg.Version)
		}

		return result, nil
	}

	// 使用在线包管理器列出已安装的包
	packages, err := onlineMgr.ListInstalled(context.Background())
	if err != nil {
		return nil, fmt.Errorf("列出已安装包失败: %w", err)
	}

	// 格式化输出
	result := make([]string, len(packages))
	for i, pkg := range packages {
		result[i] = fmt.Sprintf("%s: %s", pkg.Name, pkg.Version)
	}

	return result, nil
}

// GetSystemPackageManager 获取当前系统的包管理器名称
// 返回值:
//   - string: 包管理器名称
//   - error: 错误信息
func GetSystemPackageManager() (string, error) {
	// 创建在线包管理器实例（自动检测系统包管理器）
	onlineMgr, err := glpm.NewOnlinePackageManager(nil)
	if err != nil {
		// 如果在线包管理器创建失败，尝试创建离线包管理器
		offlineMgr, err := glpm.NewOfflinePackageManager(nil)
		if err != nil {
			return "", fmt.Errorf("无法检测系统包管理器: %w", err)
		}

		return offlineMgr.GetManagerName(), nil
	}

	return onlineMgr.GetManagerName(), nil
}
